package br.com.gkarian.mydesk.controller.financeiro;

import java.util.List;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.gkarian.mydesk.anotacoes.RestritoUsuario;
import br.com.gkarian.mydesk.model.financeiro.TipoTransacao;
import br.com.gkarian.mydesk.services.financeiro.interfaces.FinanceiroServiceProxy;
import br.com.gkarian.mydesk.web.UsuarioWeb;

@Resource
@RestritoUsuario
public class TipoTransacaoController {

	private static final Logger LOG = Logger.getLogger(TipoTransacaoController.class);
	
	private Result result;
	private Validator validator;
	private UsuarioWeb usuarioWeb;
	private FinanceiroServiceProxy financeiroServiceProxy;
	
	public TipoTransacaoController(Result result, Validator validator,
			UsuarioWeb usuarioWeb,
			FinanceiroServiceProxy financeiroServiceProxy) {
		this.result = result;
		this.validator = validator;
		this.usuarioWeb = usuarioWeb;
		this.financeiroServiceProxy = financeiroServiceProxy;
	}
	
	@Get("/financeiro/tipoTransacao/cadastrar")
	public void cadastrarTipoTransacao() {

	}
	
	@Post("/financeiro/tipoTransacao/cadastrando")
	public void cadastrar(TipoTransacao tipoTransacao) {
		validator.validate(tipoTransacao);
		validator.onErrorRedirectTo(this).cadastrarTipoTransacao();
		
		try {
			financeiroServiceProxy.cadastrarTipoTransacao(tipoTransacao, usuarioWeb.getLogado());
			
			result.redirectTo(this).cadastrarTipoTransacao();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTipoTransacao();
		}
	}

	@Get("/financeiro/tipoTransacao/listar")
	public void listarTipoTransacao() {
		try {
			List<TipoTransacao> listaTipoTransacao = financeiroServiceProxy.listarTipoTransacaoPorUsuario(usuarioWeb.getLogado());
			result.include("listTipoTransacao", listaTipoTransacao);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTipoTransacao();
		}
	}
	
	@Delete("/financeiro/tipoTransacao/{id}/remover")
	public void remover(Integer id) {
		try {
			TipoTransacao tipoTransacao = financeiroServiceProxy.carregarTipoTransacao(id);
			financeiroServiceProxy.removerTipoTransacao(tipoTransacao);
			result.redirectTo(this).listarTipoTransacao();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).cadastrarTipoTransacao();
		}
	}
	
	@Get("/financeiro/tipoTransacao/{id}/editar")
	public void editarTipoTransacao(Integer id) {
		try {
			TipoTransacao tipoTransacao = financeiroServiceProxy.carregarTipoTransacao(id);
			result.include("tipoTransacao", tipoTransacao);
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).listarTipoTransacao();
		}
	}
	
	@Put("/financeiro/tipoTransacao/editando")
	public void editar(TipoTransacao tipoTransacao) {
		validator.validate(tipoTransacao);
		validator.onErrorRedirectTo(this).listarTipoTransacao();
		
		try {
			financeiroServiceProxy.atualizarTipoTransacao(tipoTransacao);
			
			result.redirectTo(this).listarTipoTransacao();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			validator.add(new ValidationMessage("erro.inesperado", "error"));
			validator.onErrorRedirectTo(this).listarTipoTransacao();
		}
	}
	
	
	
}
